package les

import grails.converters.*

class CirculoController {

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

    def index = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
        redirect(action: "list", params: params)
    }

    def list = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}

        params.max = Math.min(params.max ? params.int('max') : 10, 100)
        [circuloInstanceList: Circulo.list(params), circuloInstanceTotal: Circulo.count()]
    }

    def create = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
        def circuloInstance = new Circulo()
        circuloInstance.properties = params
        return [circuloInstance: circuloInstance]
    }

    def save = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
        def circuloInstance = new Circulo(params)
        if (circuloInstance.save(flush: true)) {
            flash.message = "${message(code: 'default.created.message', args: [message(code: 'circulo.label', default: 'Circulo'), circuloInstance.id])}"
            redirect(action: "show", id: circuloInstance.id)
        }
        else {
            render(view: "create", model: [circuloInstance: circuloInstance])
        }
    }

    def show = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
        def circuloInstance = Circulo.get(params.id)
        if (!circuloInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'circulo.label', default: 'Circulo'), params.id])}"
            redirect(action: "list")
        }
        else {
            [circuloInstance: circuloInstance]
        }
    }

    def edit = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
        def circuloInstance = Circulo.get(params.id)
        if (!circuloInstance) {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'circulo.label', default: 'Circulo'), params.id])}"
            redirect(action: "list")
        }
        else {
            return [circuloInstance: circuloInstance]
        }
    }

	def update = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
		def circuloInstance = Circulo.get(params.id)
		if (circuloInstance) {
			circuloInstance.nome = params.nome;
			circuloInstance.cor = params.cor;
			circuloInstance.encontro = Encontro.findById(params.encontro.id);
			for (String idsARemover : params.list('removerCoordenador')) {
				String[] ids = idsARemover.split(" ")
				for (String idARemover : ids) {
					for (Integrante integr : circuloInstance.coordenadores) {
						if (integr.id + "" == idARemover) {
							circuloInstance.coordenadores.remove(integr)
							break;
						}
					}
				}
			}
			for (String idsARemover : params.list('removerMembro')) {
				String[] ids = idsARemover.split(" ")
				for (String idARemover : ids) {
					for (Integrante integr : circuloInstance.membros) {
						if (integr.id + "" == idARemover) {
							circuloInstance.membros.remove(integr)
							break;
						}
					}
				}
			}
			for (String nomeAAdicionar : params.list('adicionarCoordenador')) {
				if (nomeAAdicionar != "") {
					ArrayList<Integrante> integrantesAAdicionar = new ArrayList<Integrante>();
					if (nomeAAdicionar.startsWith("Casal:")) {
						String nome1 = nomeAAdicionar.substring(7).split(" / ")[0];
						integrantesAAdicionar.add(Integrante.findByNome(nome1));
						String nome2 = nomeAAdicionar.split(" / ")[1];
						integrantesAAdicionar.add(Integrante.findByNome(nome2));
					}
					else {
						integrantesAAdicionar.add(Integrante.findByNome(nomeAAdicionar));
					}
					for (Integrante integranteAAdicionar : integrantesAAdicionar) {
						if (!circuloInstance.coordenadores.contains(integranteAAdicionar)) {
							circuloInstance.coordenadores.add(integranteAAdicionar);
						}
					}
				}
			}
			for (String nomeAAdicionar : params.list('adicionarMembro')) {
				if (nomeAAdicionar != "") {
					ArrayList<Integrante> integrantesAAdicionar = new ArrayList<Integrante>();
					if (nomeAAdicionar.startsWith("Casal:")) {
						String nome1 = nomeAAdicionar.substring(7).split(" / ")[0];
						integrantesAAdicionar.add(Integrante.findByNome(nome1));
						String nome2 = nomeAAdicionar.split(" / ")[1];
						integrantesAAdicionar.add(Integrante.findByNome(nome2));
					}
					else {
						integrantesAAdicionar.add(Integrante.findByNome(nomeAAdicionar));
					}
					for (Integrante integranteAAdicionar : integrantesAAdicionar) {
						if (!circuloInstance.membros.contains(integranteAAdicionar)) {
							circuloInstance.membros.add(integranteAAdicionar);
						}
					}
				}
			}
			if (!circuloInstance.hasErrors() && circuloInstance.save(flush: true)) {
				flash.message = "${message(code: 'default.updated.message', args: [message(code: 'circulo.label', default: 'Circulo'), circuloInstance.id])}"
				redirect(action: "show", id: circuloInstance.id)
			}
			else {
				render(view: "edit", model: [circuloInstance: circuloInstance])
			}
		}
		else {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'circulo.label', default: 'Circulo'), params.id])}"
			redirect(action: "list")
		}
	}
	
    def delete = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
        def circuloInstance = Circulo.get(params.id)
        if (circuloInstance) {
            try {
                circuloInstance.delete(flush: true)
                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'circulo.label', default: 'Circulo'), params.id])}"
                redirect(action: "list")
            }
            catch (org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'circulo.label', default: 'Circulo'), params.id])}"
                redirect(action: "show", id: params.id)
            }
        }
        else {
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'circulo.label', default: 'Circulo'), params.id])}"
            redirect(action: "list")
        }
    }
	
	def pegarIntegrantesParaAdicionar = {
		Circulo circuloInstance = Circulo.get(params.id)
		
		List integrantes = Integrante.findAllByNomeIlike("%${params.query}%")

		ArrayList<Integrante> integrantesParaResposta = new ArrayList<Integrante>();
		for (Integrante integrante : integrantes) {
			if (!circuloInstance.membros?.contains(integrante) && !circuloInstance.coordenadores?.contains(integrante) && !integrante.participaDoEncontro(circuloInstance.encontro)) {
				integrantesParaResposta.add(integrante)
			}
		}
		
		// Criar resposta XML
		render(contentType: "text/xml") {
			results() {
				for (i in integrantesParaResposta) {
					String nome = "";
					if (i.conjuge) {
						nome = "Casal: " + i.nome + " / " + i.conjuge.nome;
					} 
					else {
						nome = i.nome;
					}
					result(name: nome, id: i.id)
				}
			}
		}
	}
	
	def ajaxCirculosPorEncontro = {
		List circulos = Circulo.findAllByEncontro(Encontro.get(params.idencontro), [sort: "nome"])
		render circulos as JSON
	}
	
}
